// personnageDefaut.java
// implémentation minimaliste de Personnage
// il sera ensuite conseillé de dériver cette classe afin
// de masquer la methode "faitSonChoix"

package personnage;
import java.util.*;

import android.graphics.*;

import vue2D.Dessin;



import labyrinthe.Salle;
import labyrinthe.grille.SalleCarree;

/**
* La classe abstraite PersonnageDefaut implémente les fonctionnalités de base de tout type de Personnage
* 
* @author IUT
* @version 22-09-2012
*/
public class PersonnageDefaut implements Personnage
{
    private Salle salleCourante; //Salle où se trouve le personnage
    protected boolean deplacementPossible=true; //Boléen indiquant si le personnage peut de déplacer
    public int xpix ; 
    public int ypix ;
    private Salle salleChoisie = new SalleCarree(-1,-1); // au debut, salle choisie invalide
    private Collection<Salle> sallesAccessibles;
    protected Paint paint; //Pinceau pour dessiner le personnage
    

    public PersonnageDefaut(int r, int g, int b)
    {
    	this.sallesAccessibles= new ArrayList<Salle>();
    	this.paint = new Paint();
    	paint.setColor(Color.rgb(r, g, b));
    	paint.setStyle(Paint.Style.FILL);
    	
    }
    /**
    * Méthode abstraite publique faitSonChoix.<br />
    *
    * Permet de vérifier que la salle choisie par le Personnage est acessible.
    * 
    * @param sallesAccessibles 
    *               Collection contenant l'ensemble des salles accessibles par le personnage.
    * @return Salle
    *               la salle choisie si elle est accessible sinon la salle actuelle.
    */
    public Salle faitSonChoix(Collection<Salle> sallesAccessibles)
    {
    	this.sallesAccessibles = sallesAccessibles;
    	if (sallesAccessibles.contains(salleChoisie))
    		return salleChoisie;
    	// si la salle choisie n'est pas dans les salles accessibles, on ne bouge pas
    	return getPosition();
    }

    /**
    * Méthode publique getPosition.<br />
    *
    * Renvoie la position courante du personnage.
    *
    * @return Salle 
    *           la salle dans laquelle se trouve le personnage.
    */  
	public Salle getPosition()
	{
		return salleCourante;
	}

    /**
    * Méthode publique setPosition.<br />
    *
    * Permet de modifier la position courante du personnage.
    *
    * @param salleCourante 
    *           La salle dans laquelle le personnage sera placé.
    */
	public void setPosition(Salle salleCourante)
	{
		this.salleCourante = salleCourante;
	}
	
	/**
	 * Méthode publique getDeplacementPossible
	 * 
	 * @return booléen
	 * 			Si vrai, nous prenons en compte les actions de l'utilisateur pour déplacer le personnage.
	 */
	public boolean getDeplacementPossible()
	{
		return deplacementPossible;
	}
	
	/**
	 * Méthode publique setDeplacementPossible<br />
	 * 
	 * @param psd
	 */
	public void setDeplacementPossible(boolean psd)
	{
		this.deplacementPossible=psd;
	}

	/**
	 * Méthode publique paint<br />
	 * 
	 * Elle permet de dessiner le personnage sur l'écran.
	 * 
	 * @param g
	 * 			Objet Graphics sur lequel on va dessiner
	 * @param x
	 * 			Position x du personnage sur l'écran
	 * @param y
	 * 			Position y du personnage sur l'écran
	 */
	public void paint(Canvas c, int x, int y)
	{
		c.drawRect(x, y, x+Dessin.unite, y+Dessin.unite, this.paint);
	}
	
	/*int x = ((Case) getPosition()).getColonne();
		int y = ((Case) getPosition()).getLigne();
		
		// mise a jour de salle choisie
		
		if(this.getDeplacementPossible())
			switch (e.getKeyCode())
			{
				case KeyEvent.VK_LEFT : x--; break;
				case KeyEvent.VK_RIGHT : x++; break;
				case KeyEvent.VK_UP : y--; break;
				case KeyEvent.VK_DOWN : y++; break;
			}

			for (Salle s : sallesAccessibles)
			{ 
				// on regarde si le choix fait partie des salles accessibles et on le valide si c'est le cas
				if ((((Case) s).getLigne()==y)&&((Case) s).getColonne()==x)
					salleChoisie=s;
			}*/

}
